home *** CD-ROM | disk | FTP | other *** search
/ PC/CD Gamer UK 120 / CD Gamer Issue 120 (March 2003) (Disc 1).ISO / Shware / Base Golf / BaseGolf.exe / {app} / BaseGolf.exe / ftplib.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2002-11-28  |  20.6 KB  |  715 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.1)
  3.  
  4. import os
  5. import sys
  6. import string
  7.  
  8. try:
  9.     import SOCKS
  10.     socket = SOCKS
  11.     del SOCKS
  12.     from socket import getfqdn
  13.     socket.getfqdn = getfqdn
  14.     del getfqdn
  15. except ImportError:
  16.     import socket
  17.  
  18. __all__ = [
  19.     'FTP',
  20.     'Netrc']
  21. MSG_OOB = 1
  22. FTP_PORT = 21
  23.  
  24. class Error(Exception):
  25.     pass
  26.  
  27.  
  28. class error_reply(Error):
  29.     pass
  30.  
  31.  
  32. class error_temp(Error):
  33.     pass
  34.  
  35.  
  36. class error_perm(Error):
  37.     pass
  38.  
  39.  
  40. class error_proto(Error):
  41.     pass
  42.  
  43. all_errors = (Error, socket.error, IOError, EOFError)
  44. CRLF = '\r\n'
  45.  
  46. class FTP:
  47.     debugging = 0
  48.     host = ''
  49.     port = FTP_PORT
  50.     sock = None
  51.     file = None
  52.     welcome = None
  53.     passiveserver = 1
  54.     
  55.     def __init__(self, host = '', user = '', passwd = '', acct = ''):
  56.         if host:
  57.             self.connect(host)
  58.             if user:
  59.                 self.login(user, passwd, acct)
  60.             
  61.         
  62.  
  63.     
  64.     def connect(self, host = '', port = 0):
  65.         if host:
  66.             self.host = host
  67.         
  68.         if port:
  69.             self.port = port
  70.         
  71.         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  72.         self.sock.connect((self.host, self.port))
  73.         self.file = self.sock.makefile('rb')
  74.         self.welcome = self.getresp()
  75.         return self.welcome
  76.  
  77.     
  78.     def getwelcome(self):
  79.         if self.debugging:
  80.             print '*welcome*', self.sanitize(self.welcome)
  81.         
  82.         return self.welcome
  83.  
  84.     
  85.     def set_debuglevel(self, level):
  86.         self.debugging = level
  87.  
  88.     debug = set_debuglevel
  89.     
  90.     def set_pasv(self, val):
  91.         self.passiveserver = val
  92.  
  93.     
  94.     def sanitize(self, s):
  95.         if s[:5] == 'pass ' or s[:5] == 'PASS ':
  96.             i = len(s)
  97.             while i > 5 and s[i - 1] in '\r\n':
  98.                 i = i - 1
  99.             s = s[:5] + '*' * (i - 5) + s[i:]
  100.         
  101.         return `s`
  102.  
  103.     
  104.     def putline(self, line):
  105.         line = line + CRLF
  106.         if self.debugging > 1:
  107.             print '*put*', self.sanitize(line)
  108.         
  109.         self.sock.sendall(line)
  110.  
  111.     
  112.     def putcmd(self, line):
  113.         if self.debugging:
  114.             print '*cmd*', self.sanitize(line)
  115.         
  116.         self.putline(line)
  117.  
  118.     
  119.     def getline(self):
  120.         line = self.file.readline()
  121.         if self.debugging > 1:
  122.             print '*get*', self.sanitize(line)
  123.         
  124.         if not line:
  125.             raise EOFError
  126.         
  127.         if line[-2:] == CRLF:
  128.             line = line[:-2]
  129.         elif line[-1:] in CRLF:
  130.             line = line[:-1]
  131.         
  132.         return line
  133.  
  134.     
  135.     def getmultiline(self):
  136.         line = self.getline()
  137.         if line[3:4] == '-':
  138.             code = line[:3]
  139.             while 1:
  140.                 nextline = self.getline()
  141.                 line = line + '\n' + nextline
  142.                 if nextline[:3] == code and nextline[3:4] != '-':
  143.                     break
  144.                 
  145.         
  146.         return line
  147.  
  148.     
  149.     def getresp(self):
  150.         resp = self.getmultiline()
  151.         if self.debugging:
  152.             print '*resp*', self.sanitize(resp)
  153.         
  154.         self.lastresp = resp[:3]
  155.         c = resp[:1]
  156.         if c == '4':
  157.             raise error_temp, resp
  158.         
  159.         if c == '5':
  160.             raise error_perm, resp
  161.         
  162.         if c not in '123':
  163.             raise error_proto, resp
  164.         
  165.         return resp
  166.  
  167.     
  168.     def voidresp(self):
  169.         resp = self.getresp()
  170.         if resp[0] != '2':
  171.             raise error_reply, resp
  172.         
  173.         return resp
  174.  
  175.     
  176.     def abort(self):
  177.         line = 'ABOR' + CRLF
  178.         if self.debugging > 1:
  179.             print '*put urgent*', self.sanitize(line)
  180.         
  181.         self.sock.sendall(line, MSG_OOB)
  182.         resp = self.getmultiline()
  183.         if resp[:3] not in ('426', '226'):
  184.             raise error_proto, resp
  185.         
  186.  
  187.     
  188.     def sendcmd(self, cmd):
  189.         self.putcmd(cmd)
  190.         return self.getresp()
  191.  
  192.     
  193.     def voidcmd(self, cmd):
  194.         self.putcmd(cmd)
  195.         return self.voidresp()
  196.  
  197.     
  198.     def sendport(self, host, port):
  199.         hbytes = host.split('.')
  200.         pbytes = [
  201.             `port / 256`,
  202.             `port % 256`]
  203.         bytes = hbytes + pbytes
  204.         cmd = 'PORT ' + ','.join(bytes)
  205.         return self.voidcmd(cmd)
  206.  
  207.     
  208.     def makeport(self):
  209.         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  210.         sock.bind(('', 0))
  211.         sock.listen(1)
  212.         (dummyhost, port) = sock.getsockname()
  213.         (host, dummyport) = self.sock.getsockname()
  214.         resp = self.sendport(host, port)
  215.         return sock
  216.  
  217.     
  218.     def ntransfercmd(self, cmd, rest = None):
  219.         size = None
  220.         if self.passiveserver:
  221.             (host, port) = parse227(self.sendcmd('PASV'))
  222.             conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  223.             conn.connect((host, port))
  224.             if rest is not None:
  225.                 self.sendcmd('REST %s' % rest)
  226.             
  227.             resp = self.sendcmd(cmd)
  228.             if resp[0] != '1':
  229.                 raise error_reply, resp
  230.             
  231.         else:
  232.             sock = self.makeport()
  233.             if rest is not None:
  234.                 self.sendcmd('REST %s' % rest)
  235.             
  236.             resp = self.sendcmd(cmd)
  237.             if resp[0] != '1':
  238.                 raise error_reply, resp
  239.             
  240.             (conn, sockaddr) = sock.accept()
  241.         if resp[:3] == '150':
  242.             size = parse150(resp)
  243.         
  244.         return (conn, size)
  245.  
  246.     
  247.     def transfercmd(self, cmd, rest = None):
  248.         return self.ntransfercmd(cmd, rest)[0]
  249.  
  250.     
  251.     def login(self, user = '', passwd = '', acct = ''):
  252.         if not user:
  253.             user = 'anonymous'
  254.         
  255.         if not passwd:
  256.             passwd = ''
  257.         
  258.         if not acct:
  259.             acct = ''
  260.         
  261.         if user == 'anonymous' and passwd in ('', '-'):
  262.             thishost = socket.getfqdn()
  263.             
  264.             try:
  265.                 if os.environ.has_key('LOGNAME'):
  266.                     realuser = os.environ['LOGNAME']
  267.                 elif os.environ.has_key('USER'):
  268.                     realuser = os.environ['USER']
  269.                 else:
  270.                     realuser = 'anonymous'
  271.             except AttributeError:
  272.                 realuser = 'anonymous'
  273.  
  274.             passwd = passwd + realuser + '@' + thishost
  275.         
  276.         resp = self.sendcmd('USER ' + user)
  277.         if resp[0] == '3':
  278.             resp = self.sendcmd('PASS ' + passwd)
  279.         
  280.         if resp[0] == '3':
  281.             resp = self.sendcmd('ACCT ' + acct)
  282.         
  283.         if resp[0] != '2':
  284.             raise error_reply, resp
  285.         
  286.         return resp
  287.  
  288.     
  289.     def retrbinary(self, cmd, callback, blocksize = 8192, rest = None):
  290.         self.voidcmd('TYPE I')
  291.         conn = self.transfercmd(cmd, rest)
  292.         while 1:
  293.             data = conn.recv(blocksize)
  294.             if not data:
  295.                 break
  296.             
  297.             callback(data)
  298.         conn.close()
  299.         return self.voidresp()
  300.  
  301.     
  302.     def retrlines(self, cmd, callback = None):
  303.         if not callback:
  304.             callback = print_line
  305.         
  306.         resp = self.sendcmd('TYPE A')
  307.         conn = self.transfercmd(cmd)
  308.         fp = conn.makefile('rb')
  309.         while 1:
  310.             line = fp.readline()
  311.             if self.debugging > 2:
  312.                 print '*retr*', `line`
  313.             
  314.             if not line:
  315.                 break
  316.             
  317.             if line[-2:] == CRLF:
  318.                 line = line[:-2]
  319.             elif line[-1:] == '\n':
  320.                 line = line[:-1]
  321.             
  322.             callback(line)
  323.         fp.close()
  324.         conn.close()
  325.         return self.voidresp()
  326.  
  327.     
  328.     def storbinary(self, cmd, fp, blocksize = 8192):
  329.         self.voidcmd('TYPE I')
  330.         conn = self.transfercmd(cmd)
  331.         while 1:
  332.             buf = fp.read(blocksize)
  333.             if not buf:
  334.                 break
  335.             
  336.             conn.sendall(buf)
  337.         conn.close()
  338.         return self.voidresp()
  339.  
  340.     
  341.     def storlines(self, cmd, fp):
  342.         self.voidcmd('TYPE A')
  343.         conn = self.transfercmd(cmd)
  344.         while 1:
  345.             buf = fp.readline()
  346.             if not buf:
  347.                 break
  348.             
  349.             if buf[-2:] != CRLF:
  350.                 if buf[-1] in CRLF:
  351.                     buf = buf[:-1]
  352.                 
  353.                 buf = buf + CRLF
  354.             
  355.             conn.sendall(buf)
  356.         conn.close()
  357.         return self.voidresp()
  358.  
  359.     
  360.     def acct(self, password):
  361.         cmd = 'ACCT ' + password
  362.         return self.voidcmd(cmd)
  363.  
  364.     
  365.     def nlst(self, *args):
  366.         cmd = 'NLST'
  367.         for arg in args:
  368.             cmd = cmd + ' ' + arg
  369.         
  370.         files = []
  371.         self.retrlines(cmd, files.append)
  372.         return files
  373.  
  374.     
  375.     def dir(self, *args):
  376.         cmd = 'LIST'
  377.         func = None
  378.         if args[-1:] and type(args[-1]) != type(''):
  379.             (args, func) = (args[:-1], args[-1])
  380.         
  381.         for arg in args:
  382.             pass
  383.         
  384.         self.retrlines(cmd, func)
  385.  
  386.     
  387.     def rename(self, fromname, toname):
  388.         resp = self.sendcmd('RNFR ' + fromname)
  389.         if resp[0] != '3':
  390.             raise error_reply, resp
  391.         
  392.         return self.voidcmd('RNTO ' + toname)
  393.  
  394.     
  395.     def delete(self, filename):
  396.         resp = self.sendcmd('DELE ' + filename)
  397.         if resp[:3] in ('250', '200'):
  398.             return resp
  399.         elif resp[:1] == '5':
  400.             raise error_perm, resp
  401.         else:
  402.             raise error_reply, resp
  403.  
  404.     
  405.     def cwd(self, dirname):
  406.         if dirname == '..':
  407.             
  408.             try:
  409.                 return self.voidcmd('CDUP')
  410.             except error_perm:
  411.                 msg = None
  412.                 if msg[:3] != '500':
  413.                     raise error_perm, msg
  414.                 
  415.             except:
  416.                 msg[:3] != '500'
  417.  
  418.         elif dirname == '':
  419.             dirname = '.'
  420.         
  421.         cmd = 'CWD ' + dirname
  422.         return self.voidcmd(cmd)
  423.  
  424.     
  425.     def size(self, filename):
  426.         resp = self.sendcmd('SIZE ' + filename)
  427.         if resp[:3] == '213':
  428.             return int(resp[3:].strip())
  429.         
  430.  
  431.     
  432.     def mkd(self, dirname):
  433.         resp = self.sendcmd('MKD ' + dirname)
  434.         return parse257(resp)
  435.  
  436.     
  437.     def rmd(self, dirname):
  438.         return self.voidcmd('RMD ' + dirname)
  439.  
  440.     
  441.     def pwd(self):
  442.         resp = self.sendcmd('PWD')
  443.         return parse257(resp)
  444.  
  445.     
  446.     def quit(self):
  447.         resp = self.voidcmd('QUIT')
  448.         self.close()
  449.         return resp
  450.  
  451.     
  452.     def close(self):
  453.         if self.file:
  454.             self.file.close()
  455.             self.sock.close()
  456.             self.file = self.sock = None
  457.         
  458.  
  459.  
  460. _150_re = None
  461.  
  462. def parse150(resp):
  463.     global _150_re
  464.     if resp[:3] != '150':
  465.         raise error_reply, resp
  466.     
  467.     if _150_re is None:
  468.         import re
  469.         _150_re = re.compile('150 .* \\((\\d+) bytes\\)', re.IGNORECASE)
  470.     
  471.     m = _150_re.match(resp)
  472.     if m:
  473.         return int(m.group(1))
  474.     
  475.     return None
  476.  
  477. _227_re = None
  478.  
  479. def parse227(resp):
  480.     global _227_re
  481.     if resp[:3] != '227':
  482.         raise error_reply, resp
  483.     
  484.     if _227_re is None:
  485.         import re
  486.         _227_re = re.compile('(\\d+),(\\d+),(\\d+),(\\d+),(\\d+),(\\d+)')
  487.     
  488.     m = _227_re.search(resp)
  489.     if not m:
  490.         raise error_proto, resp
  491.     
  492.     numbers = m.groups()
  493.     host = '.'.join(numbers[:4])
  494.     port = (int(numbers[4]) << 8) + int(numbers[5])
  495.     return (host, port)
  496.  
  497.  
  498. def parse257(resp):
  499.     if resp[:3] != '257':
  500.         raise error_reply, resp
  501.     
  502.     if resp[3:5] != ' "':
  503.         return ''
  504.     
  505.     dirname = ''
  506.     i = 5
  507.     n = len(resp)
  508.     while i < n:
  509.         c = resp[i]
  510.         i = i + 1
  511.         if c == '"':
  512.             if i >= n or resp[i] != '"':
  513.                 break
  514.             
  515.             i = i + 1
  516.         
  517.         dirname = dirname + c
  518.     return dirname
  519.  
  520.  
  521. def print_line(line):
  522.     print line
  523.  
  524.  
  525. def ftpcp(source, sourcename, target, targetname = '', type = 'I'):
  526.     if not targetname:
  527.         targetname = sourcename
  528.     
  529.     type = 'TYPE ' + type
  530.     source.voidcmd(type)
  531.     target.voidcmd(type)
  532.     (sourcehost, sourceport) = parse227(source.sendcmd('PASV'))
  533.     target.sendport(sourcehost, sourceport)
  534.     treply = target.sendcmd('STOR ' + targetname)
  535.     if treply[:3] not in ('125', '150'):
  536.         raise error_proto
  537.     
  538.     sreply = source.sendcmd('RETR ' + sourcename)
  539.     if sreply[:3] not in ('125', '150'):
  540.         raise error_proto
  541.     
  542.     source.voidresp()
  543.     target.voidresp()
  544.  
  545.  
  546. class Netrc:
  547.     __defuser = None
  548.     __defpasswd = None
  549.     __defacct = None
  550.     
  551.     def __init__(self, filename = None):
  552.         if not filename:
  553.             if os.environ.has_key('HOME'):
  554.                 filename = os.path.join(os.environ['HOME'], '.netrc')
  555.             else:
  556.                 raise IOError, 'specify file to load or set $HOME'
  557.         
  558.         self._Netrc__hosts = { }
  559.         self._Netrc__macros = { }
  560.         fp = open(filename, 'r')
  561.         in_macro = 0
  562.         while 1:
  563.             line = fp.readline()
  564.             if not line:
  565.                 break
  566.             
  567.             if in_macro and line.strip():
  568.                 macro_lines.append(line)
  569.                 continue
  570.             elif in_macro:
  571.                 self._Netrc__macros[macro_name] = tuple(macro_lines)
  572.                 in_macro = 0
  573.             
  574.             words = line.split()
  575.             host = user = passwd = acct = None
  576.             default = 0
  577.             i = 0
  578.             while i < len(words):
  579.                 w1 = words[i]
  580.                 if i + 1 < len(words):
  581.                     w2 = words[i + 1]
  582.                 else:
  583.                     w2 = None
  584.                 if w1 == 'default':
  585.                     default = 1
  586.                 elif w1 == 'machine' and w2:
  587.                     host = w2.lower()
  588.                     i = i + 1
  589.                 elif w1 == 'login' and w2:
  590.                     user = w2
  591.                     i = i + 1
  592.                 elif w1 == 'password' and w2:
  593.                     passwd = w2
  594.                     i = i + 1
  595.                 elif w1 == 'account' and w2:
  596.                     acct = w2
  597.                     i = i + 1
  598.                 elif w1 == 'macdef' and w2:
  599.                     macro_name = w2
  600.                     macro_lines = []
  601.                     in_macro = 1
  602.                     break
  603.                 
  604.                 i = i + 1
  605.             if default:
  606.                 if not user:
  607.                     pass
  608.                 self._Netrc__defuser = self._Netrc__defuser
  609.                 if not passwd:
  610.                     pass
  611.                 self._Netrc__defpasswd = self._Netrc__defpasswd
  612.                 if not acct:
  613.                     pass
  614.                 self._Netrc__defacct = self._Netrc__defacct
  615.             
  616.             if host:
  617.                 if self._Netrc__hosts.has_key(host):
  618.                     (ouser, opasswd, oacct) = self._Netrc__hosts[host]
  619.                     if not user:
  620.                         pass
  621.                     user = ouser
  622.                     if not passwd:
  623.                         pass
  624.                     passwd = opasswd
  625.                     if not acct:
  626.                         pass
  627.                     acct = oacct
  628.                 
  629.                 self._Netrc__hosts[host] = (user, passwd, acct)
  630.             
  631.         fp.close()
  632.  
  633.     
  634.     def get_hosts(self):
  635.         return self._Netrc__hosts.keys()
  636.  
  637.     
  638.     def get_account(self, host):
  639.         host = host.lower()
  640.         user = passwd = acct = None
  641.         if self._Netrc__hosts.has_key(host):
  642.             (user, passwd, acct) = self._Netrc__hosts[host]
  643.         
  644.         if not user:
  645.             pass
  646.         user = self._Netrc__defuser
  647.         if not passwd:
  648.             pass
  649.         passwd = self._Netrc__defpasswd
  650.         if not acct:
  651.             pass
  652.         acct = self._Netrc__defacct
  653.         return (user, passwd, acct)
  654.  
  655.     
  656.     def get_macros(self):
  657.         return self._Netrc__macros.keys()
  658.  
  659.     
  660.     def get_macro(self, macro):
  661.         return self._Netrc__macros[macro]
  662.  
  663.  
  664.  
  665. def test():
  666.     debugging = 0
  667.     rcfile = None
  668.     while sys.argv[1] == '-d':
  669.         debugging = debugging + 1
  670.         del sys.argv[1]
  671.     if sys.argv[1][:2] == '-r':
  672.         rcfile = sys.argv[1][2:]
  673.         del sys.argv[1]
  674.     
  675.     host = sys.argv[1]
  676.     ftp = FTP(host)
  677.     ftp.set_debuglevel(debugging)
  678.     userid = passwd = acct = ''
  679.     
  680.     try:
  681.         netrc = Netrc(rcfile)
  682.     except IOError:
  683.         if rcfile is not None:
  684.             sys.stderr.write('Could not open account file -- using anonymous login.')
  685.         
  686.     except:
  687.         rcfile is not None
  688.  
  689.     
  690.     try:
  691.         (userid, passwd, acct) = netrc.get_account(host)
  692.     except KeyError:
  693.         sys.stderr.write('No account -- using anonymous login.')
  694.  
  695.     ftp.login(userid, passwd, acct)
  696.     for file in sys.argv[2:]:
  697.         if file[:2] == '-l':
  698.             ftp.dir(file[2:])
  699.         elif file[:2] == '-d':
  700.             cmd = 'CWD'
  701.             if file[2:]:
  702.                 cmd = cmd + ' ' + file[2:]
  703.             
  704.             resp = ftp.sendcmd(cmd)
  705.         elif file == '-p':
  706.             ftp.set_pasv(not (ftp.passiveserver))
  707.         else:
  708.             ftp.retrbinary('RETR ' + file, sys.stdout.write, 1024)
  709.     
  710.     ftp.quit()
  711.  
  712. if __name__ == '__main__':
  713.     test()
  714.  
  715.